#include <iostream>
struct Test
{
    Test()
    {
        std::cout<<"构造函数\n"<<std::endl;
    }
    ~Test()
    {
        std::cout<<"析构函数\n"<<std::endl;
    }
};
int &func(int * a , int n)  // 为啥加引用
{
    throw Test();
    // if(n >= 3)
    // {
    //     throw 3.14;
    // }
    // if(n < 0)
    // {
    //     throw 10;
    // }
    // return a[n];
}

int main()
{
    int a[3] = {1,2,3};
    try //该函数可能会产生异常
    {
        func(a,3);
    }
    catch(int) //如果出现异常，捕获异常
    {
        std::cout<<"捕获到int异常，数组越界！"<<std::endl;
    }
    catch(double) //如果出现异常，捕获异常
    {
        std::cout<<"捕获到double异常！"<<std::endl;
    }
    catch(...)
    {
        std::cout<<"捕获到其他异常！"<<std::endl;
    }
    //异常被捕获之后就不会导致程序终止，程序可以继续执行
    //异常只能按照捕获的类型严格匹配，匹配不上则不会捕获
    //异常可以抛出多种，也可以捕获多种
    std::cout<<"helloworld"<<std::endl;

    return 0;
}